package com.example.tliaswebmanagement.controller;

import com.example.tliaswebmanagement.anno.Log;
import com.example.tliaswebmanagement.pojo.Dept;
import com.example.tliaswebmanagement.pojo.Result;
import com.example.tliaswebmanagement.service.DeptService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.logging.Logger;

@Slf4j
@RestController   // = Controller + ResponseBody
@RequestMapping("/depts")
public class DeptController {
//    private static final Logger log = LoggerFactory.getLogger(DeptController.class);

    // DI 依赖注入
    private final DeptService deptService;

    public DeptController(DeptService deptService) {
        this.deptService = deptService;
    }

    /**
     * 部门列表查询
     */
    @GetMapping
    public Result findAll() {
        List<Dept> deptList = deptService.findAll();
        return Result.success(deptList);
    }

    /**
     * 删除指定部门
     */
    @Log
    @DeleteMapping
    //方法 1：基于 HttpServletRequest 获取请求参数 (繁琐，不常用)
//    public Result deleteById(HttpServletRequest httpServletRequest) {
//        String idStr = httpServletRequest.getParameter("id");
//        // 将 id 手动转换为 int
//        int id = Integer.parseInt(idStr);
//        System.out.println("删除的部门id为：" + id);
//        // 走到这里表示能成功删除
//        return Result.success();
//    }

    // 方法2：使用 @RequestParam 将请求参数绑定给方法形参    因为 RequestParam 低层含有 boolean required() default true，默认为true，所以在请求时必须传递参数
//    public Result deleteById(@RequestParam(value = "id", required = false) Integer deptId) {
//        System.out.println("删除的部门id为：" + deptId);
//        return Result.success();
//    }

    // 方法3：如果请求参数名 与 形参变量名相同，那么直接定义方法形参就可以接收 (推荐)
    public Result deleteById(Integer id) {
//        System.out.println("删除的部门id为：" + id);
        log.info("删除的部门id为：{}", id);
        deptService.deleteById(id);
        return Result.success();
    }

    /**
     * 添加部门 (接收JSON格式的擦书，通常会使用一个实体对象进行接收)
     * 规则：JSON 数据的键名与方法形参对象的属性名相同，并需要使用 @RequestBody 注解标识
     */
    @Log
    @PostMapping
    public Result addDept(@RequestBody Dept dept) {
//        System.out.println("添加的部门名称为：" + dept);
        log.info("添加的部门名称为：{}", dept);
        deptService.addDept(dept);
        return Result.success();
    }

    /**
     * 根据 id 查询数据（查询回显）
     * 路径参数：通过请求URL直接传递参数，使用 {...} 来标识该路径参数，需要使用 @PathVariable 获取路径参数
     * 简化：当路径参数名 与 形参名一致时，@PathVariable 后的属性值可以省略
     */
    @GetMapping("/{id}")  // {} 占位符,
    public Result getById(@PathVariable("id") Integer id) {
//        System.out.println("要查询的部门id：" + id);
        log.info("要查询的部门id：{}", id);
        // 查询部门数据返回给前端
        Dept dept = deptService.getById(id);
        return Result.success(dept);
    }

    /**
     * 修改部门
     */
    @Log
    @PutMapping
    public Result update(@RequestBody Dept dept) {
//        System.out.println("修改部门：" + dept);
        log.info("修改部门：{}", dept);
        deptService.update(dept);
        return Result.success(dept);
    }
}
